#include "../exercise.h"

// READ: 有 cv 限定符的成员函数 <https://zh.cppreference.com/w/cpp/language/member_functions>

struct Fibonacci {
    int numbers[11];
    // TODO: 修改方法签名和实现，使测试通过
    // 修改方法签名：添加const限定符
    int get(int i) const {
        // 简单的边界检查
        if (i < 0 || i >= 11) {
            return 0;  // 或者可以抛出异常
        }
        return numbers[i];
    }
};

int main(int argc, char **argv) {
    Fibonacci constexpr FIB{{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55}};
    ASSERT(FIB.get(10) == 55, "fibonacci(10) should be 55");
    std::cout << "fibonacci(10) = " << FIB.get(10) << std::endl;
    return 0;
}

/*
声明一个结构体的const、constexpr对象，那么这个结构体的所有东西要加const？ 

const关键字：在函数参数列表后添加const，表示这个函数不会修改对象的成员变量
为什么需要：因为FIB被声明为constexpr常量，只能在它上面调用const成员函数

constexpr：表示这个对象是编译期常量
聚合初始化：使用花括号初始化数组成员
const成员函数的重要性
在C++中，const成员函数有以下几个重要特点：

不会修改对象状态：保证调用后对象状态不变
可以在const对象上调用：这是最主要的原因
重载解析：可以根据对象的constness选择不同的函数版本
接口契约：向使用者明确表明函数不会修改对象
*/